// --------------------------------------------------------------------------------------------------------------------
// <copyright file="ITrace.cs" company="AzureContrib (Open source library http://azurecontrib.codeplex.com)">
//   Microsoft Public License (Ms-PL)
// </copyright>
// <summary>
//   The trace contract.
// </summary>
// --------------------------------------------------------------------------------------------------------------------

using System;
using System.Diagnostics.CodeAnalysis;

namespace AzureContrib.WindowsAzure.Diagnostics
{
	/// <summary>
	/// The trace contract.
	/// </summary>
	public interface ITrace : ITraceSwitchable, ITraceControls
	{
		#region Old School

		/// <summary>
		/// Maps to <see cref="System.Diagnostics.Trace.TraceInformation(string)"/>
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void TraceInformation(string message);

		/// <summary>
		/// Maps to <see cref="System.Diagnostics.Trace.TraceInformation(string,object[])"/>
		/// </summary>
		/// <param name="format">
		/// The format.
		/// </param>
		/// <param name="args">
		/// The args.
		/// </param>
// ReSharper disable MethodOverloadWithOptionalParameter
		void TraceInformation(string format, params object[] args);
// ReSharper restore MethodOverloadWithOptionalParameter

		/// <summary>
		/// Maps to <see cref="System.Diagnostics.Trace.TraceWarning(string)"/>
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void TraceWarning(string message);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.TraceWarning(string,object[])"/>
		/// </summary>
		/// <param name="format">
		/// The format.
		/// </param>
		/// <param name="args">
		/// The args.
		/// </param>
// ReSharper disable MethodOverloadWithOptionalParameter
		void TraceWarning(string format, params object[] args);
// ReSharper restore MethodOverloadWithOptionalParameter

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.TraceError(string)"/>
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void TraceError(string message);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.TraceError(string,object[])"/>
		/// </summary>
		/// <param name="format">
		/// The format.
		/// </param>
		/// <param name="args">
		/// The args.
		/// </param>
// ReSharper disable MethodOverloadWithOptionalParameter
		void TraceError(string format, params object[] args);
// ReSharper restore MethodOverloadWithOptionalParameter

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.Write(object)"/>
		/// </summary>
		/// <param name="value">
		/// The value.
		/// </param>
		void Write(object value);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.Write(string)"/>
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void Write(string message);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.Write(object,string)"/>
		/// </summary>
		/// <param name="value">
		/// The value.
		/// </param>
		/// <param name="category">
		/// The category.
		/// </param>
		void Write(object value, string category);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace"/>
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="category">
		/// The category.
		/// </param>
		void Write(string message, string category);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.WriteIf(bool,string)"/>
		/// </summary>
		/// <param name="condition">
		/// The condition.
		/// </param>
		/// <param name="message">
		/// The Message.
		/// </param>
		void WriteIf(bool condition, string message);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.WriteIf(bool,object,string)"/>
		/// </summary>
		/// <param name="condition">
		/// The condition.
		/// </param>
		/// <param name="value">
		/// The value.
		/// </param>
		/// <param name="category">
		/// The category.
		/// </param>
		void WriteIf(bool condition, object value, string category);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.WriteIf(bool,string,string)"/>
		/// </summary>
		/// <param name="condition">
		/// The condition.
		/// </param>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="category">
		/// The category.
		/// </param>
		void WriteIf(bool condition, string message, string category);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.WriteLine(object)"/>
		/// </summary>
		/// <param name="value">
		/// The value.
		/// </param>
		void WriteLine(object value);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.WriteLine(string)"/>
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void WriteLine(string message);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.WriteLine(object,string)"/>
		/// </summary>
		/// <param name="value">
		/// The value.
		/// </param>
		/// <param name="category">
		/// The category.
		/// </param>
		void WriteLine(object value, string category);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.WriteLine(string,string)"/>
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="category">
		/// The category.
		/// </param>
		void WriteLine(string message, string category);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.WriteLineIf(bool,object)"/>
		/// </summary>
		/// <param name="condition">
		/// The condition.
		/// </param>
		/// <param name="value">
		/// The value.
		/// </param>
		void WriteLineIf(bool condition, object value);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.WriteLineIf(bool,string)"/>
		/// </summary>
		/// <param name="condition">
		/// The condition.
		/// </param>
		/// <param name="message">
		/// The message.
		/// </param>
		void WriteLineIf(bool condition, string message);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.WriteLineIf(bool,object,string)"/>
		/// </summary>
		/// <param name="condition">
		/// The condition.
		/// </param>
		/// <param name="value">
		/// The value.
		/// </param>
		/// <param name="category">
		/// The category.
		/// </param>
		void WriteLineIf(bool condition, object value, string category);

		/// <summary>
		/// Calls <see cref="System.Diagnostics.Trace.WriteLineIf(bool,string,string)"/>
		/// </summary>
		/// <param name="condition">
		/// The condition.
		/// </param>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="category">
		/// The category.
		/// </param>
		void WriteLineIf(bool condition, string message, string category);

		#endregion

		#region Verbose

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void Verbose(Func<string> message);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void Verbose(string message);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg">The type of the argument.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg">
		/// The arg.
		/// </param>
		void Verbose<TArg>(string message, TArg arg);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg">The type of argument.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg">
		/// The arg.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Verbose<TArg>(string message, TArg arg, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of argument 1.</typeparam>
		/// <typeparam name="TArg2">The type of argument 2.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		void Verbose<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Verbose<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		void Verbose<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Verbose<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		void Verbose<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Verbose<TArg1, TArg2, TArg3, TArg4>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		void Verbose<TArg1, TArg2, TArg3, TArg4, TArg5>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1618:GenericTypeParametersMustBeDocumented",
			Justification = "Reviewed. Suppression is OK here.")]
		void Verbose<TArg1, TArg2, TArg3, TArg4, TArg5>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <typeparam name="TArg6">The type of arg 6.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="arg6">
		/// The arg 6.
		/// </param>
		void Verbose<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6);

		/// <summary>
		/// Trace a Message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <typeparam name="TArg6">The type of arg 6.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="arg6">
		/// The arg 6.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Verbose<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, IFormatProvider provider);

		#endregion Verbose

		#region Information

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void Information(Func<string> message);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void Information(string message);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg">The type of arg.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg">
		/// The arg.
		/// </param>
		void Information<TArg>(string message, TArg arg);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg">The type of arg.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg">
		/// The arg.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Information<TArg>(string message, TArg arg, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		void Information<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Information<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		void Information<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Information<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		void Information<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Information<TArg1, TArg2, TArg3, TArg4>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		void Information<TArg1, TArg2, TArg3, TArg4, TArg5>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Information<TArg1, TArg2, TArg3, TArg4, TArg5>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <typeparam name="TArg6">The type of arg 6.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="arg6">
		/// The arg 6.
		/// </param>
		void Information<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6);

		/// <summary>
		/// Trace a Message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <typeparam name="TArg6">The type of arg 6.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="arg6">
		/// The arg 6.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Information<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, IFormatProvider provider);

		#endregion Information

		#region Warning

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void Warning(Func<string> message);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void Warning(string message);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg">The type of arg.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg">
		/// The arg.
		/// </param>
		void Warning<TArg>(string message, TArg arg);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg">The type of arg.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg">
		/// The arg.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Warning<TArg>(string message, TArg arg, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		void Warning<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Warning<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		void Warning<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Warning<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		void Warning<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Warning<TArg1, TArg2, TArg3, TArg4>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		void Warning<TArg1, TArg2, TArg3, TArg4, TArg5>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Warning<TArg1, TArg2, TArg3, TArg4, TArg5>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <typeparam name="TArg6">The type of arg 6.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="arg6">
		/// The arg 6.
		/// </param>
		void Warning<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6);

		/// <summary>
		/// Trace a Message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <typeparam name="TArg6">The type of arg 6.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="arg6">
		/// The arg 6.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Warning<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, IFormatProvider provider);

		#endregion Warning

		#region Error

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error(Func<string> message);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg">The type of arg.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg">
		/// The arg.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg>(string message, TArg arg);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg">The type of arg.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg">
		/// The arg.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg>(string message, TArg arg, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg1, TArg2, TArg3, TArg4>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg1, TArg2, TArg3, TArg4, TArg5>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg1, TArg2, TArg3, TArg4, TArg5>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <typeparam name="TArg6">The type of arg 6.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="arg6">
		/// The arg 6.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <typeparam name="TArg6">The type of arg 6.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="arg6">
		/// The arg 6.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Error", Justification = "The name Error is better than having to use TraceError. It is redundant.")]
		void Error(string message);

		#endregion

		#region Critical

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void Critical(Func<string> message);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <param name="message">
		/// The Message.
		/// </param>
		void Critical(string message);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg">The type of arg.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg">
		/// The arg.
		/// </param>
		void Critical<TArg>(string message, TArg arg);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg">The type of arg.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg">
		/// The arg.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Critical<TArg>(string message, TArg arg, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		void Critical<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Critical<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		void Critical<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Critical<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		void Critical<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Critical<TArg1, TArg2, TArg3, TArg4>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		void Critical<TArg1, TArg2, TArg3, TArg4, TArg5>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Critical<TArg1, TArg2, TArg3, TArg4, TArg5>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, IFormatProvider provider);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <typeparam name="TArg6">The type of arg 6.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="arg6">
		/// The arg 6.
		/// </param>
		void Critical<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6);

		/// <summary>
		/// Trace a Message as Critical.
		/// </summary>
		/// <typeparam name="TArg1">The type of arg 1.</typeparam>
		/// <typeparam name="TArg2">The type of arg 2.</typeparam>
		/// <typeparam name="TArg3">The type of arg 3.</typeparam>
		/// <typeparam name="TArg4">The type of arg 4.</typeparam>
		/// <typeparam name="TArg5">The type of arg 5.</typeparam>
		/// <typeparam name="TArg6">The type of arg 6.</typeparam>
		/// <param name="message">
		/// The Message.
		/// </param>
		/// <param name="arg1">
		/// The arg 1.
		/// </param>
		/// <param name="arg2">
		/// The arg 2.
		/// </param>
		/// <param name="arg3">
		/// The arg 3.
		/// </param>
		/// <param name="arg4">
		/// The arg 4.
		/// </param>
		/// <param name="arg5">
		/// The arg 5.
		/// </param>
		/// <param name="arg6">
		/// The arg 6.
		/// </param>
		/// <param name="provider">
		/// The provider.
		/// </param>
		void Critical<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(
			string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, IFormatProvider provider);

		#endregion Critical
	}
}